home *** CD-ROM | disk | FTP | other *** search
/ SuperHack / SuperHack CD.bin / CODING / PASCAL / ALLSWAGS.ZIP / SWAGG-M.ZIP / MISC.SWG / 0185_How to read a Lotus 123 file.pas < prev    next >
Encoding:
Pascal/Delphi Source File  |  1996-08-30  |  23.2 KB  |  795 lines

  1.  
  2. UNIT U123;  {Soure PC MAG. DECEMBER 13 1988... and others}
  3.             { YES !  I did it in TP seven years Ago !!!}
  4.  
  5. INTERFACE
  6.  
  7. {
  8. This routines ARE simple to use as 123.. :-)
  9. 1)  Open the file
  10. 2)  Add what you want.. where you want
  11. 3)  Close the File
  12. }
  13.  
  14. PROCEDURE Open123(n:string);
  15. PROCEDURE Close123;
  16. PROCEDURE ColW123(c:integer; a:byte);
  17. PROCEDURE Add123Int(c,f:integer; v:integer);
  18. PROCEDURE Add123Rea(c,f:integer; v:double);
  19. PROCEDURE Add123TXC(c,f:integer; v:string);
  20. PROCEDURE Add123TXL(c,f:integer; v:string);
  21.  
  22. PROCEDURE Add123TXR(c,f:integer; v:string);
  23. PROCEDURE Add123FML(c,f:integer; s:string);
  24.  
  25. {
  26.   Open123(n:string);
  27.   n = File Name WITHOUT EXTENSION it ALways add WK1
  28.   It didn't check for a valid File Name or Existing, is
  29.   YOUR responsability to do that
  30.  
  31.  
  32.   Close123;
  33.   Close the Open File .. Always DO THIS !
  34.  
  35.   In the rest of PROCEDURES c=Column and f=Row
  36.   c and F begins with 0 (cero)
  37.   if you want to Add in cell A1, use c=0 f=0
  38.   if you want to Add in cell B2, use c=1 f=1
  39.   etc.
  40.  
  41.  
  42.   Add123Int(c,f:integer; v:integer);
  43.  
  44.   Add a Integer value (v) in Col=c  Row=f
  45.  
  46.   Add123Rea(c,f:integer; v:double);
  47.   Add a Double value (v) in Col=c  Row=f
  48.  
  49.   Add123TXC(c,f:integer; v:string);
  50.   Add a Label (v) in Col=C  Row=f
  51.   - Label CENTER -
  52.  
  53.   Add123TXR(c,f:integer; v:string);
  54.   Add a Label (v) in Col=C  Row=f
  55.   - Label at RIGHT -
  56.  
  57.   Add123TXL(c,f:integer; v:string);
  58.   Add a Label (v) in Col=C  Row=f
  59.   - Label at LEFT -
  60.  
  61.   ColW123(c:integer; a:byte);
  62.   Change width of Col=c to size=a
  63.  
  64.   Add123FML(c,f:integer; s:string);
  65.   Add Formula (s) at Col=c  Row=f
  66.  
  67.   Examples:
  68.            Add123FML(0,0,'A5+B2+A3*C5');
  69.            Add123FML(0,1,'@Sum(B1..B8)');
  70.  
  71.  
  72.   ==========================================
  73.   THE ONLY VALID @ function is SUM   !!!!
  74.   Sorry :-(
  75.   ==========================================
  76.  
  77. }
  78.  
  79.  
  80. { The rest of Comments are in SPANISH ... Sorry again }
  81.  
  82.  
  83. IMPLEMENTATION
  84. CONST
  85.      C00 = $00;
  86.      CFF = $FF;
  87.  
  88. VAR
  89.    ALotus : File;
  90.  
  91. PROCEDURE Open123(n:string);
  92.  
  93. Type
  94.     Abre = record
  95.                    Cod  : integer;
  96.                    Lon  : integer;
  97.                    Vlr  : integer;
  98.              end;
  99.  
  100. Var
  101.    Formato  : array[1..6] of byte;
  102.    Registro : Abre absolute Formato;
  103.  
  104.  
  105. Begin
  106.      Assign(ALotus,n+'.WK1');
  107.  
  108.      Rewrite(ALotus,1);
  109.      with Registro do
  110.      begin
  111.           Cod:=0;
  112.           Lon:=2;
  113.           Vlr:=1030;
  114.      end;
  115.      BlockWrite(ALotus,Formato[1],6);
  116. End;
  117.  
  118. PROCEDURE Close123;
  119.  
  120. Type
  121.     Cierra = record
  122.                    Cod  : integer;
  123.                    Lon  : integer;
  124.              end;
  125.  
  126. Var
  127.    Formato  : array[1..4] of byte;
  128.    Registro : Cierra absolute Formato;
  129.  
  130.  
  131. Begin
  132.      with Registro do
  133.      begin
  134.           Cod:=1;
  135.           Lon:=0;
  136.      end;
  137.      BlockWrite(ALotus,Formato[1],4);
  138.      Close(ALotus);
  139.  
  140. End;
  141.  
  142. PROCEDURE ColW123(c:integer; a:byte);
  143.  
  144. Type
  145.     Ancho = record
  146.                    Cod  : integer;
  147.                    Lon  : integer;
  148.                    Col  : integer;
  149.                    Anc  : byte;
  150.              end;
  151.  
  152. Var
  153.    Formato  : array[1..7] of byte;
  154.    Registro : Ancho absolute Formato;
  155.  
  156.  
  157. Begin
  158.      with Registro do
  159.      begin
  160.           Cod:=8;
  161.           Lon:=3;
  162.           Col:=c;
  163.           Anc:=a;
  164.      end;
  165.      BlockWrite(ALotus,Formato[1],7);
  166. End;
  167.  
  168.  
  169. PROCEDURE Add123Int(c,f,v:integer);
  170.  
  171. Type
  172.     Entero = record
  173.  
  174.                    Cod  : integer;
  175.                    Lon  : integer;
  176.                    Frm  : byte;
  177.                    Col  : integer;
  178.                    Fil  : integer;
  179.                    Vlr  : integer;
  180.              end;
  181.  
  182. Var
  183.    Formato  : array[1..11] of byte;
  184.    Registro : Entero absolute Formato;
  185.  
  186. Begin
  187.      with Registro do
  188.      begin
  189.           Cod:=13;
  190.           Lon:=7;
  191.           Frm:=255;
  192.           Fil:=f;
  193.           Col:=c;
  194.           Vlr:=v;
  195.      end;
  196.  
  197.      Blockwrite(ALotus,Formato[1],11);
  198. End;
  199.  
  200. PROCEDURE Add123Rea(c,f:integer; v:double);
  201. Type
  202.  
  203.     Entero = record
  204.                    Cod  : integer;
  205.                    Lon  : integer;
  206.                    Frm  : byte;
  207.                    Col  : integer;
  208.                    Fil  : integer;
  209.                    Vlr  : double;
  210.              end;
  211. Var
  212.    Formato  : array[1..17] of byte;
  213.    Registro : Entero absolute Formato;
  214. Begin
  215.      with Registro do
  216.      begin
  217.           Cod:=14;
  218.           Lon:=13;
  219.           Frm:=2 or 128;
  220.           Fil:=f;
  221.           Col:=c;
  222.           Vlr:=v;
  223.      end;
  224.  
  225.      Blockwrite(ALotus,Formato[1],17);
  226. End;
  227.  
  228.  
  229. PROCEDURE GrabaTXT(c,f:integer; v:string; t:char);
  230.  
  231. Type
  232.     Entero = record
  233.                    Cod  : integer;
  234.                    Lon  : integer;
  235.                    Frm  : byte;
  236.                    Col  : integer;
  237.                    Fil  : integer;
  238.                    Vlr  : array[1..100] of char;
  239.              end;
  240. Var
  241.    Formato  : array[1..109] of byte;
  242.    Registro : Entero absolute Formato;
  243.    i        : word;
  244. Begin
  245.      with Registro do
  246.      begin
  247.           Cod:=15;
  248.           Lon:=length(v)+7;
  249.           Frm:=255;
  250.           Fil:=f;
  251.           Col:=c;
  252.           Vlr[1]:=t;
  253.           for i:=1 to Length(v) do Vlr[i+1]:=v[i];
  254.  
  255.           Vlr[i+2]:=chr(0);
  256.      end;
  257.      Blockwrite(ALotus,Formato[1],length(v)+11);
  258. End;
  259.  
  260. PROCEDURE Add123TXL(c,f:integer; v:string);
  261. begin
  262.      GrabaTXT(c,f,v,'''');
  263. end;
  264. PROCEDURE Add123TXC(c,f:integer; v:string);
  265. begin
  266.      GrabaTXT(c,f,v,'^');
  267. end;
  268. PROCEDURE Add123TXR(c,f:integer; v:string);
  269. begin
  270.      GrabaTXT(c,f,v,'"');
  271. end;
  272.  
  273.  
  274.  
  275.  
  276.  
  277.  
  278. PROCEDURE Add123FML(c,f:integer; s:string);
  279.  
  280. Type
  281.     Formula = record
  282.                     Cod : integer;                {codigo}
  283.                     Lon : integer;                {longitud}
  284.  
  285.                     Frm : byte;                   {formato}
  286.                     Col : integer;                {columna}
  287.                     Fil : integer;                {fila}
  288.                     Res : Double;                {resultado de formula}
  289.                     Tma : integer;                {tamanio de formula en bytes}
  290.                     Fml : array[1..2048] of byte; {formula}
  291.               end;
  292.     symbol = (cel,num,arr,mas,men,por,dvs,pot,pa1,pa2);
  293.     consym = set of symbol;
  294.  
  295. Var
  296.    Formato   : array[1..2067] of byte;
  297.  
  298.    Registro  : Formula absolute Formato;
  299.    fabs      : boolean;                {flag que indica si ffml es absoluta}
  300.    v,                                  {v    = string 's' sin blancos}
  301.    nro       : string;                 {nro  = numero de ffml}
  302.    cfml,                               {cfml = valor de columna en formula}
  303.    ffml      : word;                   {ffml =   "    " fila     "    "   }
  304.    nfml,                               {nfml =   "    " constante "   "   }
  305.    i,                                  {i    = indice de 'v' (formula) }
  306.  
  307.    ii,                                 {ii   =    "    " 's'     "     }
  308.    index,                              {index=    "    " Fml}
  309.    j,ret,                              {usados para convertir a numeros}
  310.    len,                                {len  = longitud de 'v'}
  311.    lens      : integer;                {lens =     "     " 's'}
  312.    sym       : symbol;                 {sym  = ultimo simbolo leido}
  313.    symsig,                             {usados para analizar formula para }
  314.    syminifac : consym;                 {grabarla con notacion posfija     }
  315.  
  316.    z         : byte;                   {indice para inicializar array}
  317.  
  318.  
  319.    Procedure CalculaDir(var Reg : Formula);
  320.  
  321.    var
  322.       veces : integer;
  323.  
  324.       (*   Primero, se decide si cfml es absoluta o relativa. Si es absoluta
  325.            calcula el valor real. Si es relativa primero chequea si cfml<col.
  326.            Si cfml<col le resta cfml a 49152 (C000); este numero es usado por
  327.            Lotus para calcular la direccion de una celda a la izquierda de
  328.            donde esta parado. Si col<=cfml le suma cfml a 32768 para encender
  329.  
  330.            el MSB que indica que es relativa (la C tambien lo prende).
  331.  
  332.            Segundo, se procede de la misma manera con ffml para determinar si
  333.            es absoluta o relativa, y despues se calcula la direccion en base
  334.            a eso y a la relacion de ffml con fil.
  335.       *)
  336.  
  337.    begin
  338.         with Reg do
  339.         begin
  340.              if v[i]='$' then             {calcula la columna (cfml)}
  341.              begin
  342.                   inc(i);
  343.                   cfml:=ord(v[i])-ord('A');
  344.  
  345.                   inc(i);
  346.                   while (v[i] in ['A'..'Z']) and (len>=i) do
  347.                   begin
  348.                        cfml:=(cfml+1)*26+ord(v[i])-ord('A');
  349.                        inc(i);
  350.                   end;
  351.              end
  352.              else
  353.              begin
  354.                   if (ord(v[i])-ord('A') < col) then
  355.                   begin
  356.                        cfml:=49152-col+(ord(v[i])-ord('A'));
  357.                        inc(i);
  358.                        veces:=1;
  359.                        while (v[i] in ['A'..'Z']) and (len>=i) do
  360.                        begin
  361.  
  362.                             cfml:=49152-col+(26*veces)+(ord(v[i])-ord('A'));
  363.                             cfml:=cfml+((ord(v[i-1])-ord('A'))*26);
  364.                             inc(i);
  365.                             inc(veces);
  366.                        end;
  367.                   end
  368.                   else
  369.                   begin
  370.                        cfml:=ord(v[i])-ord('A');
  371.                        inc(i);
  372.                        while (v[i] in ['A'..'Z']) and  (len>=i) do
  373.                        begin
  374.  
  375.                             cfml:=(cfml+1)*26+ord(v[i])-ord('A');
  376.                             inc(i);
  377.                        end;
  378.                        cfml:=cfml+32768-col;
  379.                   end;
  380.              end;
  381.  
  382.              Fml[index]:=Lo(cfml);        {graba cfml}
  383.              inc(index);                  {que posee }
  384.              Fml[index]:=Hi(cfml);        {dos bytes }
  385.              inc(index);
  386.  
  387.              if v[i]='$' then             {calcula la fila (ffml)}
  388.              begin
  389.                   inc(i);
  390.                   fabs:=true;
  391.  
  392.              end
  393.              else
  394.                  fabs:=false;
  395.              j:=i;
  396.              while (v[i] in ['0'..'9']) and (len>=i) do
  397.              begin
  398.                   inc(i);
  399.              end;
  400.              nro:=copy(v,j,i-j);
  401.              val(nro,ffml,ret);
  402.  
  403.              if fabs then                 {siempre se resta 1 por estar en base 0}
  404.              begin
  405.                   if ffml>0 then ffml:=ffml-1;
  406.              end
  407.              else
  408.              begin
  409.                   if fil<ffml then
  410.  
  411.                   begin
  412.                        ffml:=32768+abs(ffml-fil)-1;
  413.                   end
  414.                   else
  415.                   begin
  416.                        ffml:=49152-abs(ffml-fil)-1;
  417.                   end;
  418.              end;
  419.  
  420.              Fml[index]:=Lo(ffml);        {graba ffml}
  421.              inc(index);                  {que posee }
  422.              Fml[index]:=Hi(ffml);        {dos bytes }
  423.              inc(index);
  424.         end;
  425.    end;
  426.  
  427.    Procedure CalculaNum(var Reg : Formula);
  428.  
  429.    var
  430.       VDoble  : array[1..8] of byte;
  431.  
  432.       dfml    : Double absolute VDoble;
  433.       d       : real;
  434.       esreal  : boolean;
  435.       k       : byte;
  436.       numero  : longint;
  437.       codigo  : integer;
  438.  
  439.    begin
  440.         with Reg do
  441.         begin
  442.              esreal:=false;
  443.              j:=i;
  444.              while (v[i] in ['0'..'9','.']) and (len>=i) do
  445.              begin
  446.                   if v[i]='.' then esreal:=true;
  447.                   inc(i);
  448.              end;
  449.              nro:=copy(v,j,i-j);
  450.              {R-}
  451.                  val(nro,numero,codigo);
  452.              {R+}
  453.  
  454.                  if (codigo=0) and (numero>=-32768) and (numero<=32767) then
  455.                     esreal:=false
  456.                  else
  457.                      esreal:=true;
  458.  
  459.              if esreal then
  460.              begin
  461.                   val(nro,d,ret);             {convierte en real doble}
  462.                   dfml:=d;
  463.                   {ConvRD(d,dfml);}
  464.  
  465.                   Fml[index]:=0;              {0 = indica que sigue una constante}
  466.                   inc(index);                 {    real doble precision (8 bytes)}
  467.                   for k:=1 to 8 do
  468.  
  469.                   begin
  470.                        Fml[index]:=VDoble[k];   {graba dfml}
  471.                        inc(index);            {son ocho bytes}
  472.                   end;
  473.              end
  474.              else
  475.              begin
  476.                   val(nro,nfml,ret);          {convierte en entero}
  477.  
  478.                   Fml[index]:=5;              {5 = indica que sigue una constante }
  479.                   inc(index);                 {    entera con signo (2 bytes)     }
  480.                   Fml[index]:=Lo(nfml);       {graba nfml}
  481.                   inc(index);                 {son dos bytes}
  482.  
  483.                   Fml[index]:=Hi(nfml);
  484.                   inc(index);
  485.              end;
  486.              dec(i);
  487.         end;
  488.    end;
  489.  
  490.    Procedure CalculaRan(var Reg : Formula);
  491.  
  492.    begin
  493.         with Reg do
  494.         begin
  495.              Fml[index]:=2;               {2 = codigo de rango; le sigue 8 bytes}
  496.              inc(index);                  {    que son (col1fil1..col2fil2)     }
  497.  
  498.              CalculaDir(Reg);             {calcula col1fil1}
  499.              i:=i+2;                      {salta los 2 ..  }
  500.              CalculaDir(Reg);             {calcula col2fil2}
  501.  
  502.         end;
  503.    end;
  504.  
  505.    Procedure CalculaArr(var Reg : Formula);
  506.  
  507.    {** SOLO CODIFICA @TRUE,@FALSE,@SUM(COL1FIL1..COL2FIIL2) **}
  508.  
  509.    var
  510.       func,dir : string;                  {func  = string del @}
  511.                                           {dir   = del rango}
  512.       N_arg,nc : byte;                    {N_arg = cantidad de argumentos}
  513.                                           {nc    = numero de codigo (T,F,S)}
  514.  
  515.    begin
  516.         with Reg do
  517.         begin
  518.              inc(i);
  519.              case v[i] of
  520.  
  521.                          'F' : nc:=51;
  522.                          'T' : nc:=52;
  523.                          'S' : nc:=80;
  524.              end;
  525.  
  526.              while (v[i] in ['A'..'Z']) and (len>=i) do inc(i);
  527.              inc(i);
  528.              if nc=80 then
  529.              begin
  530.                   CalculaRan(Reg);        {calcula el rango (col1fil1..col2fil2}
  531.                   N_arg:=1;               {hay un solo argumento}
  532.              end;
  533.  
  534.              Fml[index]:=nc;
  535.              inc(index);
  536.              if nc=80 then
  537.              begin
  538.                   Fml[index]:=N_arg;      {graba numero de argumentos}
  539.  
  540.                   inc(index);
  541.              end;
  542.         end;
  543.    end;
  544.  
  545.    Procedure TraerChar;
  546.  
  547.    begin
  548.         inc(i);                           {carga el simbolo para }
  549.         if len>=i then                    {la recursividad       }
  550.         begin
  551.              case v[i] of
  552.                          'A'..'Z','$' : sym:=cel;
  553.                          '0'..'9','.' : sym:=num;
  554.                          '@'          : sym:=arr;
  555.                          '+'          : sym:=mas;
  556.                          '-'          : sym:=men;
  557.  
  558.                          '*'          : sym:=por;
  559.                          '/'          : sym:=dvs;
  560.                          '^'          : sym:=pot;
  561.                          '('          : sym:=pa1;
  562.                          ')'          : sym:=pa2;
  563.              end;
  564.         end;
  565.    end;
  566.  
  567.  
  568.    Procedure Expresion(symsig : consym; var Reg : Formula);
  569.    var
  570.       opsuma:symbol;
  571.  
  572.    Procedure Termino(symsig : consym; var Reg : Formula);
  573.    var
  574.       opmul:symbol;
  575.  
  576.    Procedure Factor(symsig : consym; var Reg : Formula);
  577.  
  578.    var
  579.       opexp:symbol;
  580.  
  581.    Procedure Exponente(symsig : consym; var Reg : Formula);
  582.  
  583.    begin{Exponente}
  584.         while (sym in syminifac) and (len>=i) do
  585.         begin
  586.              case sym of
  587.                         num : begin
  588.                                    CalculaNum(Registro);
  589.                                    TraerChar;
  590.                               end;
  591.                         cel : begin
  592.                                    Reg.Fml[index]:=1;
  593.                                    inc(index);
  594.                                    CalculaDir(Registro);
  595.  
  596.                                    dec(i);
  597.                                    TraerChar;
  598.                               end;
  599.                         arr : begin
  600.                                    CalculaArr(Registro);
  601.                                    TraerChar;
  602.                               end;
  603.              else
  604.                  begin
  605.                       if sym=pa1 then
  606.                       begin
  607.                            TraerChar;
  608.                            Expresion([pa2]+symsig,Registro);
  609.                            if sym=pa2 then
  610.  
  611.                            begin
  612.                                 Reg.Fml[index]:=4;       {4 = simbolo '(' }
  613.                                 inc(index);
  614.                                 TraerChar;
  615.                            end;
  616.                       end;
  617.                  end;
  618.              end;
  619.         end;
  620.    end;{Exponente}
  621.  
  622.    begin{Factor}
  623.         Exponente(symsig+[pot],Registro);
  624.         while (sym=pot) and (len>=i) do
  625.         begin
  626.              opexp:=sym;
  627.              TraerChar;
  628.              Exponente(symsig+[pot],Registro);
  629.  
  630.              if opexp=pot then
  631.              begin
  632.                   Reg.Fml[index]:=13;                    {13 = simbolo '^' }
  633.                   inc(index);
  634.              end;
  635.         end;
  636.    end;{Factor}
  637.  
  638.    begin{Termino}
  639.         Factor(symsig+[por,dvs],Registro);
  640.         while (sym in [por,dvs]) and (len>=i) do
  641.         begin
  642.              opmul:=sym;
  643.              TraerChar;
  644.              Factor(symsig+[por,dvs],Registro);
  645.              if (opmul=por) or (opmul=dvs) then
  646.              begin
  647.                   if opmul=por then Reg.Fml[index]:=11   {11 = simbolo '*' }
  648.  
  649.                   else
  650.                       Reg.Fml[index]:=12;                {12 = simbolo '/' }
  651.                   inc(index);
  652.              end;
  653.         end;
  654.    end;{Termino}
  655.  
  656.    begin{Expresion}
  657.  
  658.       (*   Este es el primero de cuatro procedimientos recursivos (Expresion,
  659.            Termino, Factor y Exponente) que se usan para transformar la formula
  660.            en una expresion en notacion posfija, tal como se debe grabar. La
  661.            tecnica consiste en retrasar la transmision del operador aritmetico.
  662.  
  663.            Ejemplo:  a+(b*c)^d  ==>  abc*(d^+  .
  664.  
  665.            Expresion analiza si es suma o resta. Luego llama a Termino. Al
  666.            volver trae el proximo dato y llama otra vez a Termino. Al volver
  667.            genera el codigo de suma o resta si hubo.
  668.  
  669.            Termino llama a Factor. Al volver trae el proximo dato y llama otra
  670.            vez a Factor. Al volver genera el codigo de multiplicacion o division
  671.            si hubo.
  672.  
  673.            Factor llama a Exponente. Al volver trae el proximo dato y llama
  674.  
  675.            otra vez a Exponente. Cuando vuele genera el codigo de exponenciacion
  676.            si hubo.
  677.  
  678.            Exponente analiza si el valor es un numero, una celda, un arroba o
  679.            un parentesis. Si es un parentesis, vuelve a llamar a Expresion para
  680.            calcular el contenido este; sino genera el codigo correspondiente.
  681.  
  682.       *)
  683.  
  684.         if sym in [mas,men] then
  685.         begin
  686.              opsuma:=sym;
  687.              TraerChar;
  688.              Termino(symsig+[mas,men],Registro);
  689.              if opsuma=men then
  690.  
  691.              begin
  692.                   Reg.Fml[index]:=8;                     {8 = simbolo '-' unario}
  693.                   inc(index);
  694.              end;
  695.         end
  696.         else
  697.             Termino(symsig+[mas,men],Registro);
  698.         while (sym in [mas,men]) and (len>=i) do
  699.         begin
  700.              opsuma:=sym;
  701.              TraerChar;
  702.              Termino(symsig+[mas,men],Registro);
  703.              if (opsuma=mas) or (opsuma=men) then
  704.              begin
  705.                   if opsuma=mas then Reg.Fml[index]:=9   { 9 = simbolo '+' }
  706.                   else
  707.                       Reg.Fml[index]:=10;                {10 = simbolo '-' }
  708.  
  709.                   inc(index);
  710.              end;
  711.         end;
  712.    end;{Expresion}
  713.  
  714.  
  715. Begin
  716.      with Registro do
  717.      begin
  718.           Cod:=16;                     {16= formula}
  719.           Col:=c;
  720.           Fil:=f;
  721.  
  722.           Frm:=0;                      {Comienzo con 0}
  723. (*
  724.           if p=true then Frm:=Frm+128; {Si se protege se prende el MSB}
  725.  
  726.           ch:=UpCase(ch);              {Veo que formato se quiere y prendo }
  727.                                        {los bits respectivos               }
  728.  
  729.           case ch of
  730.                    'F' : Frm:=Frm+  0; {'F' ==> decimales fijos    }
  731.                    'S' : Frm:=Frm+ 16; {'S' ==> notacion cientifica}
  732.                    'C' : Frm:=Frm+ 32; {'C' ==> moneda corriente   }
  733.                    'P' : Frm:=Frm+ 48; {'P' ==> porcentaje         }
  734.                    'M' : Frm:=Frm+ 64; {',' ==> miles con comas    }
  735.                    'O' : Frm:=Frm+112; {'O' ==> otros              }
  736.           end;
  737.  
  738.           Frm:=Frm+d;                  {Si ch<>'O' ==> d= cant. de decimales}
  739.  
  740.                                        {Si ch= 'O' ==> d= 1 --> general     }
  741.                                        {                  2 --> DD/MMM/AA   }
  742.                                        {                  3 --> DD/MMM      }
  743.                                        {                  4 --> MM/AA       }
  744.                                        {                  5 --> texto       }
  745.                                        {                  6 --> hidden      }
  746.                                        {                  7 --> date; HH-MM-SS}
  747.                                        {                  8 --> date; HH-MM }
  748.  
  749.                                        {                  9 --> date; int'l 1 }
  750.                                        {                 10 --> date; int'l 2 }
  751.                                        {                 11 --> time; int'l 1 }
  752.                                        {                 12 --> time; int'l 2 }
  753.                                        {              13-14 --> no utilizado}
  754.                                        {                 15 --> default     }
  755.  
  756.   *)
  757.            Res:=C00;
  758. {          for z:=1 to 8 do Res[z]:=C00;} {se modifica automaticamente cuando se recalcula y regraba}
  759.  
  760.  
  761.           lens:=length(s);             {convierto todo a mayusculas}
  762.           for ii:=1 to lens do s[ii]:=UpCase(s[ii]);
  763.           i:=1;
  764.           v:='';
  765.           for ii:=1 to lens do         {paso el string 's' al string 'v' }
  766.           begin                        {eliminando los espacios en blanco}
  767.                if s[ii]<>' ' then
  768.                begin
  769.                     v:=v+s[ii];
  770.                     inc(i);
  771.                end;
  772.           end;
  773.  
  774.           len:=i-1;
  775.           i:=0;
  776.           index:=1;
  777.  
  778.  
  779.           syminifac:=[cel,num,arr,pa1];
  780.           symsig:=syminifac;
  781.  
  782.           TraerChar;                   {toma el primer caracter de formula}
  783.           Expresion(symsig,Registro);  {analiza y graba toda la formula}
  784.  
  785.           Fml[index]:=3;               {3 = fin de formula}
  786.           Tma:=index;                  {tamanio de Fml}
  787.           Lon:=15+Tma;                 {longitud de dato}
  788.           BlockWrite(ALotus,Formato[1],19+index);
  789.      end;
  790. End;
  791.  
  792.  
  793. END.
  794.  
  795.